<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>3228. 将 1 移动到末尾的最大操作次数</title>
</head>
<body>
  <script>
//     给你一个 二进制字符串 s。

// 你可以对这个字符串执行 任意次 下述操作：

// 选择字符串中的任一下标 i（ i + 1 < s.length ），该下标满足 s[i] == '1' 且 s[i + 1] == '0'。
// 将字符 s[i] 向 右移 直到它到达字符串的末端或另一个 '1'。例如，对于 s = "010010"，如果我们选择 i = 1，结果字符串将会是 s = "000110"。
// 返回你能执行的 最大 操作次数。

 

// 示例 1：

// 输入： s = "1001101"

// 输出： 4

// 解释：

// 可以执行以下操作：

// 选择下标 i = 0。结果字符串为 s = "0011101"。
// 选择下标 i = 4。结果字符串为 s = "0011011"。
// 选择下标 i = 3。结果字符串为 s = "0010111"。
// 选择下标 i = 2。结果字符串为 s = "0001111"。
// 示例 2：

// 输入： s = "00111"

// 输出： 0

 

// 提示：

// 1 <= s.length <= 105
// s[i] 为 '0' 或 '1'。

/**
 * 替换字符串中指定位置的字符
 * @param {string} str 原始字符串
 * @param {number} index 要替换的字符索引 (从0开始)
 * @param {string} newChar 新的字符
 * @returns {string} 替换后的新字符串
 */
function replaceCharAt(str, index, newChar) {
  // 1. 截取索引 index 之前的部分
  const before = str.slice(0, index);
  
  // 2. 截取索引 index 之后的部分
  const after = str.slice(index + 1);
  
  // 3. 将三部分拼接起来
  return before + newChar + after;
}

/**
 * @param {string} s
 * @return {number}
 */
var maxOperations = function(s) {
  // 去除字符串s前面的0
  let newS = s.replace(/^0+/, '');
  // let newS = s.lstrip('0');
  let count = 0;
  let needChangeI = -1;
  if (newS.length === 0) {
      return 0;
  }

  while (newS.indexOf('10') != -1) {
      needChangeI = newS.indexOf('10');
      // debugger
      if (needChangeI + 1 == newS.length - 1) {
        newS = replaceCharAt(newS, needChangeI, '0');
        newS = replaceCharAt(newS, needChangeI + 1, '1');
        newS = newS.replace(/^0+/, '');
        count++;
        continue
      }
      for (let i = needChangeI + 1; i < newS.length; i++) {
          if (newS[i] === '1') {
              newS = replaceCharAt(newS, needChangeI, '0');
              newS = replaceCharAt(newS, i - 1, '1');
              newS = newS.replace(/^0+/, '');
              count++;
              break;
          }
          if (i === newS.length - 1) {
              newS = replaceCharAt(newS, needChangeI, '0');
              newS = replaceCharAt(newS, i, '1');
              newS = newS.replace(/^0+/, '');
              count++;
          }
      }

  }
  return count;
};

/**
 * 替换字符串中的一个区间
 * @param {string} str 原始字符串
 * @param {number} start 区间开始索引 (包含)
 * @param {number} end 区间结束索引 (不包含)
 * @param {string} newSubStr 用于替换的新字符串
 * @returns {string} 替换后的新字符串
 */
function replaceRange(str, start, end, newSubStr) {
  // 1. 截取 start 之前的部分
  const before = str.slice(0, start);
  
  // 2. 截取 end 及之后的部分
  const after = str.slice(end);
  
  // 3. 将三部分拼接起来
  return before + newSubStr + after;
}

/**
 * @param {string} s
 * @return {number}
 */
var maxOperationsMy = function(s) {
  // 去除字符串s前面的0
  let newS = s.replace(/^0+/, '');
  // let newS = s.lstrip('0');
  let count = 0;
  let needChangeI = -1;
  if (newS.length === 0) {
      return 0;
  }

  while (newS.indexOf('10') != -1) {
    // debugger
      needChangeI = newS.indexOf('10');
      for (let i = needChangeI + 1; i < newS.length; i++) {
          if (newS[i] === '1') {
              count+= (needChangeI + 1);
              newS = replaceRange(newS, 0, i,"1".repeat(needChangeI + 1));
              break;
          }
          if (i === newS.length - 1) {
            // 后面都是0了
            // 统计newS中1的个数
            count+= (needChangeI + 1);
            return count;
          }
      }

  }
  return count;
};

var maxOperationsAnswer = function(s) {
    let countOne = 0;
    let ans = 0;
    let i = 0;
    while (i < s.length) {
        if (s[i] === '0') {
            while (i + 1 < s.length && s[i + 1] === '0') {
                i++;
            }
            ans += countOne;
        } else {
            countOne++;
        }
        i++;
    }
    return ans;
};

console.log(maxOperationsMy('1001101'));
  </script>
</body>
</html>